<!DOCTYPE html>
<html>
<script type="text/javascript">
	
/* map

	1. 本质上是键值对的集

	2. Map也可以接受一个数组作为参数。该数组的成员是一个个表示键值对的数组,例1

	3. 键值对都具有类型， 例2

	4. 对同一个键多次赋值，后面的值将覆盖前面的值

	5. 只有对同一个对象的引用，Map结构才将其视为同一个键， 例3

	6. NaN不严格相等于自身，但Map将其视为同一个键, 例4

	7. ...运算符解构， 例5 

	8. 结合数组的map方法、filter方法，可以实现Map的遍历和过滤（Map本身没有map和
	   filter方法）, 例6

*/


// 1. 创建
{
	var map = new Map([
	  ['name', '张三'],
	  ['title', 'Author']
	]);

	console.log(map.size)  			// 2
	console.log(map.has('name'))    // true
	console.log(map.get('name'))   	// "张三"
	console.log(map.has('title'))  	// true
	console.log(map.get('title'))  	// "Author"
}



// 2. 键值对都具有类型
{
	var m = new Map([
	  [true, 'foo'],
	  ['true', 'bar']
	]);

	console.log(m.get(true))   // 'foo'
	console.log(m.get('true')) // 'bar'
}



// 3. 对同一个对象的引用才视为同一个键值对
{
	var map = new Map();

	map.set(['a'], 555);
	console.log(map.get(['a'])) // undefined
}



// 4. NaN和-0 +0
{
	let map = new Map();

	map.set(NaN, 123);
	console.log(map.get(NaN)) // 123

	map.set(-0, 123);
	console.log(map.get(+0)) // 123
}



// 5. ...解构
{
	let map = new Map([
	  [1, 'one'],
	  [2, 'two'],
	  [3, 'three'],
	]);

	console.log([...map.keys()])
	// [1, 2, 3]

	console.log([...map.values()])
	// ['one', 'two', 'three']

	console.log([...map.entries()])
	// [[1,'one'], [2, 'two'], [3, 'three']]

	console.log([...map])
	// [[1,'one'], [2, 'two'], [3, 'three']]
}



// 6. map和fliter
{
	let map0 = new Map()
		.set(1, 'a')
		.set(2, 'b')
		.set(3, 'c');

	let map1 = new Map(
		[...map0].filter(([k, v]) => k < 3)
	);
	let res = [...map0].filter(([k, v]) => k > 0);
	// 返回二位数组，键值对的形式
	console.log(map1);
	console.log(res)
	// 产生Map结构 {1 => 'a', 2 => 'b'}

	let map2 = new Map(
	 	[...map0].map(([k, v]) => [k * 2, '_' + v])
	);
	console.log(map2)
	// 产生Map结构 {2 => '_a', 4 => '_b', 6 => '_c'}
}

</script>
</html>